안드로이드(Android) - Multi Fragment :: 안드로이드 설치 및 개발[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

안드로이드 설치 및 개발
[1]
등록일:2018-07-15 08:28:12 (0%)
작성자:
제목:안드로이드(Android) - Multi Fragment

Multi Fragment

여러 Fragment를 만들어서 하나의 Activity 안에 갈아끼우는 방식으로 진행해보겠습니다.



프로젝트 만들기

프래그먼트를 실습할 프로젝트를 생성하겠습니다.

activity_main.xml 레이아웃을 수정합니다.



Fragment 만들기

FirstFragment 라는 이름으로 프래그먼트를 만들겠습니다.


fragment_first.xml 레이아웃을 수정합니다.


Activity에서 Fragment 관리하기

Activity 에서는 프래그먼트를 관리하는 역할만합니다.

v4 허니콤버전입니다.

v7 아이스크림샌드위치 버전입니다.

Fragment는 허니콤 버전(v4)를 이용하겠습니다.

package com.ktds.cocomo.mymultifragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private Fragment firstFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        firstFragment = new FirstFragment();
        setDefaultFragment();
    }

    /**
     * MainActivity가 처음 실행될 때
     * 최초로 보여질 Fragment를 세팅한다.
     */
    public void setDefaultFragment() {

        /**
         * 화면에 보여지는 Fragment를 관리한다.
         * FragmentManager : Fragment를 바꾸거나 추가하는 객체
         */
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        /**
         * R.id.container(activity_main.xml)에 띄우겠다.
         * 첫번째로 보여지는 Fragment는 firstFragment로 설정한다.
         */
        transaction.add(R.id.container, firstFragment);

        /**
         * Fragment의 변경사항을 반영시킨다.
         */
        transaction.commit();
    }
}


transaction에서 add는 두번째 것을 사용합니다.


FirstFragment 수정

아래 코드와 같이 수정합니다.

package com.ktds.cocomo.mymultifragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FirstFragment extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    public FirstFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment FirstFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static FirstFragment newInstance(String param1, String param2) {
        FirstFragment fragment = new FirstFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false);
    }
}


결과



두번째 Fragment를 만듭니다.

SecondFragment 이름으로 만듭니다.


SecondFragment.java 파일을 아래와 같이 수정합니다.

package com.ktds.cocomo.mymultifragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class SecondFragment extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    public SecondFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment SecondFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static SecondFragment newInstance(String param1, String param2) {
        SecondFragment fragment = new SecondFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_second, container, false);
    }
}



MainActivity에서 secondFragment 정의

MainActivity에서 SecondFragment 객체를 만들어줍니다.

private Fragment firstFragment;
private Fragment secondFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    firstFragment = new FirstFragment();
    secondFragment = new SecondFragment();
    setDefaultFragment();
}



Fragment 바꾸기

MainActivity에서 FirstFragment를 띄워주고 FirstFragment에 버튼을 하나 둔 뒤 버튼을 누르면 Activity의 메소드(replaceFragment)를 통해 SecondFragment로 갈아끼워보겠습니다.


MainActivity에 replaceFragment 메소드를 추가합니다.


    /**
     * Fragment 변경
     * @param fragmentId : 보여질 Fragment
     */
    public void replaceFragment(int fragmentId) {

        /**
         * 화면에 보여지는 Fragment를 관리한다.
         * FragmentManager : Fragment를 바꾸거나 추가하는 객체
         */
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        /**
         * R.id.container(activity_main.xml)에 띄우겠다.
         * 파라미터로 오는 fragmentId에 따라 다음에 보여질 Fragment를 설정한다.
         */
        if ( fragmentId == 1 ) {
            transaction.replace(R.id.container, firstFragment);
        } else if ( fragmentId == 2 ) {
            transaction.replace(R.id.container, secondFragment);
        }

        /**
         * Fragment의 변경사항을 반영시킨다.
         */
        transaction.commit();
    }


fragment_first.xml 레이아웃에 다음 Fragment로 이동할 수 있는 버튼을 추가합니다.


FirstFragment에서 onCreateView 메소드를 수정합니다.

    private Button nextFragment;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_first, container, false);

        nextFragment = (Button) view.findViewById(R.id.nextFragment);
        nextFragment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                /**
                 * 안좋은 방법
                 * 클래스 캐스팅을 통한 방법
                 * Activity를 MainActivity라고 정의를 해버려서
                 * 이 Fragment는 MainActivity 밖에 쓸 수가 없다.
                 */
                // ((MainActivity) getActivity()).replaceFragment(2);

                /**
                 * 좋은 방법
                 * 인터페이스를 통한 방법
                 * 굳이 MainActivity가 아니더라도 FragmentReplaceable을 상속받으면
                 * 이 프래그먼트를 사용할 수 있다.
                 */
                ((FragmentReplaceable) getActivity()).replaceFragment(2);

            }
        });

        return view;
    }


인터페이스 생성합니다.

public interface FragmentReplaceable extends Serializable {

    public void replaceFragment(int fragmentId);

}


MainActivity에서 FragmentReplaceable 인터페이스를 implement합니다.

public class MainActivity extends AppCompatActivity implements FragmentReplaceable



replaceFragment 메소드에 @Override 적어줍니다.

    /**
     * Fragment 변경
     * @see FragmentReplaceable
     * @param fragmentId : 보여질 Fragment
     */
    @Override
    public void replaceFragment(int fragmentId)


replaceFragment 메소드에 뒤로가기 기능을 추가합니다.

        /**
         * Back 버튼 클릭시 이전 프래그먼트로 이동시킨다.
         */
        transaction.addToBackStack(null);



세번째 프래그먼트 만들기

위와 같은 방식으로 세번째 Fragment도 만들겠습니다.

세번째 프래그먼트에선 버튼을 누르면 다시 첫번째 프래그먼트로 이동하도록 했습니다.

결과 화면입니다.


첫번째 프래그먼트에서 버튼을 누르면 두번째 프래그먼트로 이동합니다.


두번째 프래그먼트에서 버튼을 누르면 세번째 프래그먼트로 이동합니다.


세번째 프래그먼트에서 버튼을 누르면 다시 첫 프래그먼트로 이동합니다.



Fragment 간의 parameter 전달하기

Fragment 간의 파라미터 전달하는 방법은

github.com/cocomo1316/Android 에서 My Multi Fragment 폴더에 코드가 있습니다.

이상으로 멀티 프래그먼트를 마치겠습니다.


[본문링크] 안드로이드(Android) - Multi Fragment
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=34708
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.